//	COPYRIGHT (C) 1980 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

MANIFEST $( MAXARFITTINGS = 50 $);

LET MARKARATS(ARPATRECS,GSTRT,GSTP) = VALOF
 $( STATIC $( NODESETS = NIL; NARPATS = NIL; NSETS = NIL; SETIX = NIL;
              ND = NIL; NODESET = NIL; ELEM = NIL; REMOVE = NIL;
              SOMEAR = NIL; GSTART = NIL; GSTOP = NIL; ONSW = NIL $);

 LET PROCARMATCH() BE
  $( STATIC $( ND = NIL; NODESET = NIL; SETIX = NIL $);
  NSETWDSM1:=GSTOP>>P2WDSZ;
  NODESET:=ZEROSET(MAKESET());
  ND:=GSTART-1;
  WHILE ND<GSTOP DO
   $(
   ND:=ND+1;
   IF MAPPEDTO!ND>0 DO FLIPELEM(ND,NODESET)
   $);
  SETIX:=0;
  WHILE SETIX<NSETS DO
   $(
   SETIX:=SETIX+1;
   IF SETEQUAL(NODESET,NODESETS!SETIX) DO
    $(
    FREESET(NODESET);
    NSETWDSM1:=ONSW;
    RETURN
    $)
   $);
  NSETS:=NSETS+1;
  IF NSETS>MAXARFITTINGS DO
   $(
   OUTS("CAN'T GO ON - OVERWHELMING AROMATICITY*C*L");
   TOPORSTOP()
   $);
  NODESETS!NSETS:=NODESET;
  ND:=GSTART-1;
  WHILE ND<GSTOP DO
   $( ND:=ND+1; IF TESTELEM(ND,NODESET) DO ARTYPE!ND:=ARTYPE!ND+1 $);
  NSETWDSM1:=ONSW
  $);

 LET ARNOTLIKE(P,G) =
 (TESTELEM(ATTYPE!G,ATTYPE!P) ->
  (CTSTOP!P-CTSTART!P LE CTSTOP!G-CTSTART!G -> DOTS!P NE DOTS!G,TRUE),TRUE);

 LET BADARAT() = VALOF
  $( STATIC $( ND = NIL; PTR = NIL; PTRTOP = NIL; NBR = NIL; ONBR = NIL $);
  ND:=GSTART-1;
  WHILE ND<GSTOP DO
   $(
   ND:=ND+1;
   IF ARTYPE!ND=1 DO LOOP;
   PTR:=CTSTART!ND-1;
   PTRTOP:=CTSTOP!ND;
   ONBR:=0;
   WHILE PTR<PTRTOP DO
    $(
    PTR:=PTR+1;
    NBR:=CTABLE!PTR;
    IF NBR=ONBR DO IF ARTYPE!NBR=1 DO RESULTIS ND;
    ONBR:=NBR
    $)
   $);
  RESULTIS 0
  $);

 ND:=GSTRT-1;
 WHILE ND<GSTP DO $( ND+:=1; ARTYPE!ND:=1 $);
 NARPATS:=ARPATRECS!0;
 IF NARPATS=0 DO RESULTIS FALSE;
 ONSW:=NSETWDSM1;
 NODESETS:=NEWVEC(MAXARFITTINGS);
 GSTART:=GSTRT;
 GSTOP:=GSTP;
 NSETS:=0;
 WHILE NARPATS>0 DO
  $(
  GMATCH(ARPATRECS!NARPATS,PLUSINF,GSTRT,GSTP,ARNOTLIKE,PROCARMATCH);
  NARPATS:=NARPATS-1
  $);
 IF NSETS=0 DO $( FREEVEC(NODESETS); RESULTIS FALSE $);
 NSETWDSM1:=GSTOP>>P2WDSZ;
  $(
  REMOVE:=BADARAT();
  IF REMOVE=0 DO BREAK;
  SETIX:=0;
  WHILE SETIX<NSETS DO
   $(
   SETIX:=SETIX+1;
   UNLESS TESTELEM(REMOVE,NODESETS!SETIX) DO LOOP;
   NODESET:=NODESETS!SETIX;
    $(
    ELEM:=LOWELEM(NODESET);
    IF ELEM<0 DO BREAK;
    ARTYPE!ELEM:=ARTYPE!ELEM-1;
    FLIPELEM(ELEM,NODESET)
    $) REPEAT
   $)
  $) REPEAT;
 NSETWDSM1:=ONSW;
 WHILE NSETS>0 DO $( FREESET(NODESETS!NSETS); NSETS:=NSETS-1 $);
 FREEVEC(NODESETS);
 SOMEAR:=FALSE;
 ND:=GSTART-1;
 WHILE ND<GSTOP DO
  $( ND:=ND+1; IF ARTYPE!ND=1 DO LOOP; SOMEAR:=TRUE; ARTYPE!ND:=2 $);
 RESULTIS SOMEAR
 $);

LET NEGATEARMBS(GSTART,GSTOP) BE
 $( STATIC $( ND = NIL; PTR = NIL; PTRTOP = NIL; ONBR = NIL; NBR = NIL;
              ANBR = NIL $);
 ND:=GSTART-1;
 WHILE ND<GSTOP DO
  $(
  ND:=ND+1;
  IF ARTYPE!ND=1 DO LOOP;
  PTR:=CTSTART!ND-1;
  PTRTOP:=CTSTOP!ND;
  ONBR:=0;
  WHILE PTR<PTRTOP DO
   $(
   PTR:=PTR+1;
   NBR:=CTABLE!PTR;
   ANBR:=ABS NBR;
   IF ANBR=ONBR DO CTABLE!PTR:=-NBR;
   ONBR:=ANBR
   $)
  $)
 $);
